using GEM.Domain.Entities.App;
using GEM.Domain.Events.Users;
using GEM.Domain.Repositories;
using MediatR;
using Microsoft.Extensions.Logging;

namespace GEM.Infrastructure.Events.Handlers.Users;

/// <summary>
/// 用户注册事件处理程序
/// </summary>
/// <remarks>
/// 用户注册事件处理程序是用于处理用户注册事件的组件，它负责在用户注册时执行相应的业务逻辑。
/// 处理程序通常是异步的，以避免阻塞主线程。
/// </remarks>
public class UserRegisteredDomainEventHandler : INotificationHandler<DomainEventNotification>
{
    private readonly ILogger<UserRegisteredDomainEventHandler> _logger;
    private readonly IRepository<AppUser> _userRep;
    private readonly IRepository<AppRole> _roleRep;
    public UserRegisteredDomainEventHandler(ILogger<UserRegisteredDomainEventHandler> logger, IRepository<AppUser> userRep, IRepository<AppRole> roleRep)
    {
        _logger = logger;
        _userRep = userRep;
        _roleRep = roleRep;
    }

    public async Task Handle(DomainEventNotification notification, CancellationToken cancellationToken)
    {
        if (notification.DomainEvent is UserRegisteredDomainEvent userRegisteredDomainEvent)
        {
            // 获取用户(包含角色信息)
            var user = await _userRep.GetUserWithRolesAsync(userRegisteredDomainEvent.UserId);
            if (user == null)
            {
                _logger.LogError("用户不存在,用户ID:{UserId}", userRegisteredDomainEvent.UserId);
                return;
            }

            // 获取默认角色
            var defaultRole = (await _roleRep.GetAllAsync()).FirstOrDefault(r => r.RoleName == "CommonUser");
            if (defaultRole == null)
            {
                _logger.LogError("默认角色不存在!!");
                return;
            }

            //为新用户分配默认角色及默认头像
            user.AvatarUrl = "https://ts1.tc.mm.bing.net/th/id/OIP-C.UyaBji0AU_6M3VDA2F1RvgAAAA?rs=1&pid=ImgDetMain&o=7&rm=3";
            user.AssignRole(defaultRole);
            await _userRep.UpdateAsync(user);

            // 记录日志
            _logger.LogInformation("注册新用户: 用户ID:{UserId}, 用户姓名:{Username}, 分配默认角色:{RoleName},头像",
            userRegisteredDomainEvent.UserId, userRegisteredDomainEvent.Username, defaultRole.RoleName);
            //这里添加注册后的业务逻辑，比如发送欢迎邮件，发送欢迎短信，发送欢迎消息等
            // 发送欢迎邮件
            // 发送欢迎短信
            // 发送欢迎消息···
        }
    }
}
